package so.sao.shop.supplier.service.impl;

import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import so.sao.shop.supplier.config.Constant;
import so.sao.shop.supplier.dao.PurchaseDao;
import so.sao.shop.supplier.dao.PurchaseItemDao;
import so.sao.shop.supplier.domain.Purchase;
import so.sao.shop.supplier.domain.PurchaseItem;
import so.sao.shop.supplier.pojo.Result;
import so.sao.shop.supplier.pojo.output.RecordToPurchaseItemOutput;
import so.sao.shop.supplier.pojo.vo.AccountPurchaseItemVo;
import so.sao.shop.supplier.pojo.vo.PurchaseInListVo;
import so.sao.shop.supplier.pojo.vo.PurchaseItemVo;
import so.sao.shop.supplier.service.PurchaseItemService;
import so.sao.shop.supplier.util.PageTool;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by niewenchao on 2017/7/19.
 */
@Service
public class PurchaseItemServiceImpl implements PurchaseItemService {

    @Autowired
    PurchaseItemDao purchaseItemDao;
    @Autowired
    PurchaseDao purchaseDao;

    /**
     * 根据订单编号查询所有相关的订单明细记录（分页）
     *
     * @param pageNum  当前页码
     * @param pageSize 每页显示条数
     * @param orderId  订单编号
     * @return 相关记录的集合
     */
    @Override
    public Result<RecordToPurchaseItemOutput> searchPurchaseItems(Integer pageNum, Integer pageSize, String orderId) {
        /**
         * 1  访问持久化层#findById(String orderId),根据订单编号检索该订单数据
         *      1.1  判断#findById(String orderId) 返回数据是否为空，为空返回
         * 2  使用分页工具进行分页设置
         * 3  访问持久化层#findPage(String orderId)。根据订单编号检索该订单下的明细
         * 4  封装出参信息(code、message、data)并返回
         */

        //1.获取该订单编号对应的数据
        Purchase purchase = purchaseDao.findById(orderId);
        if (null == purchase) {
            return Result.success(Constant.MessageConfig.MSG_NO_DATA);
        }

        //2. 分页
        PageTool.startPage(pageNum, pageSize);

        //3. 访问持久化层获取数据
        List<AccountPurchaseItemVo> purchaseItemList = purchaseItemDao.findPage(orderId);
        if (null != purchaseItemList && !purchaseItemList.isEmpty()) {
            //分页信息
            PageInfo<AccountPurchaseItemVo> pageInfo = new PageInfo<>(purchaseItemList);
            //订单明细所属的订单信息
            PurchaseInListVo purchaseInListVo = new PurchaseInListVo(purchase.getOrderId(), purchase.getOrderPrice(), purchase.getOrderReceiverName());
            //出参中的数据对象
            RecordToPurchaseItemOutput output = new RecordToPurchaseItemOutput();
            //将展示数据封装到出参数据对象中
            output.setPurchaseInListVo(purchaseInListVo);
            //将分页对象封装到出参对象中
            output.setPageInfo(pageInfo);
            return Result.success(Constant.MessageConfig.MSG_SUCCESS, output);
        }
        return Result.success(Constant.MessageConfig.MSG_NO_DATA);

    }

    /**
     * 更新SKU子订单的状态
     *
     * @param orderId    订单ID/SKU的退/换货单号
     * @param refundDate 退款时间
     * @param obj        订单详情实体/订单详情list
     */
    @Override
    public void updateSKUOrder(String orderId, Date refundDate, Object obj,BigDecimal amount) {
        Map<String,Object> map = new HashMap<>(16);
        if (orderId.contains("-")) {
            PurchaseItemVo purchaseItemVo = (PurchaseItemVo) obj;
            map.put("flag",0);
            map.put("orderId",orderId);
            map.put("refundDate",refundDate);
            map.put("refundMoney",amount);
            purchaseItemDao.updateSKUOrder(map);
        } else {
            List<PurchaseItemVo> purchaseItemVos = (List<PurchaseItemVo>) obj;
            map.put("flag",1);
            map.put("orderId",orderId);
            map.put("refundDate",refundDate);
            //拆分退款金额
            Map<String, Object> refundMoneyMap = getRefundMoneyMap(amount, purchaseItemVos);
            purchaseItemDao.updateSKUOrder(map);
            purchaseItemDao.updateSKUOrderRefundMoney(refundMoneyMap);
        }
    }

    /**
     * 拆分退款金额
     * @param amount 退款金额
     * @param purchaseItemVos 订单详情列表
     * @return
     */
    private Map<String, Object> getRefundMoneyMap(BigDecimal amount, List<PurchaseItemVo> purchaseItemVos) {
        Map<String,Object> refundMoneyMap = new HashMap<>(16);
        Comparator<PurchaseItemVo> byGoodsTatolPrice = Comparator.comparing(PurchaseItemVo::getGoodsTatolPrice);
        List<PurchaseItemVo> purchaseItemVosSorted =  purchaseItemVos.stream().sorted(byGoodsTatolPrice).collect(Collectors.toList());
        BigDecimal allRefundFee = new BigDecimal(0);
        for (PurchaseItemVo purchaseItemVo : purchaseItemVosSorted) {
            allRefundFee = allRefundFee.add(purchaseItemVo.getGoodsTatolPrice().subtract(purchaseItemVo.getGoodsDiscount()));
        }
        BigDecimal refundFeeDiff = allRefundFee.subtract(amount);
        if (purchaseItemVosSorted.size()>1) {
            for (int i=0; i<purchaseItemVosSorted.size(); i++) {
                refundMoneyMap.put(purchaseItemVos.get(i).getReturnNumber(),purchaseItemVos.get(i).getGoodsTatolPrice().subtract(purchaseItemVos.get(i).getGoodsDiscount()));
                if (i == (purchaseItemVosSorted.size()-1)) {
                    refundMoneyMap.put(purchaseItemVos.get(i).getReturnNumber(),purchaseItemVos.get(i).getGoodsTatolPrice().subtract(purchaseItemVos.get(i).getGoodsDiscount().add(refundFeeDiff)));
                }
            }
        } else {
            refundMoneyMap.put(purchaseItemVosSorted.get(0).getReturnNumber(),amount);
        }
        return refundMoneyMap;
    }

    /**
     * 根据订单ID获取退款中的SKU订单列表
     *
     * @param orderIds 订单ID集合
     * @return List<PurchaseItemVo> SKU订单集合
     */
    @Override
    public List<PurchaseItemVo> getRefundingOrderDetailByOIds(List<String> orderIds) {
        Integer status = 4;
        Integer type = 0;
        return purchaseItemDao.getOrderDetailByOIds(orderIds,status,type);
    }


    /**
     * 根据子订单状态查找子订单记录
     * @param status 子订单状态
     * @return
     */
    @Override
    public List<PurchaseItem> getOrderDetailsByStatus(Integer status) {
        return purchaseItemDao.getOrderDetailsByStatus(status);
    }

    /**
     * 根据子订单编号集合及子订单状态批量修改子订单记录
     * @param detailsIds 子订单编号
     * @param status 子订单状态
     * @return
     */
    @Override
    public int updateOrderDetailsStatus(List<String> detailsIds, Integer status) {
        return purchaseItemDao.updateOrderDetailsStatus(detailsIds,status);
    }
}
